// jwk
// 登录 获取用户信息
// 录入信息 操作信息
// 头像上传

// 1. 启动一个后端服务
var express = require("express");
var bodyParser = require("body-parser");
// 跨域
var cors = require("cors");
// 1.2 配置post请求
var exApp = express();
exApp.use(
  bodyParser.urlencoded({
    extended: true
  })
);
exApp.use(bodyParser.json());
// 1.3 开启跨域设置
exApp.use(cors());
// 1.4 开启后端服务端口
exApp.listen(3000, () => console.log("http://localhost:3000"));

// 数据库
var mongoose = require("mongoose");
var MongoApp = mongoose.createConnection("mongodb://127.0.0.1:27017/tetx", {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useFindAndModify: false
});
//监听数据库的状态
MongoApp.on("open", () => {
  console.log("数据库连接成功");
});
MongoApp.on("error", () => {
  console.log("数据库连接错误");
});
MongoApp.on("close", () => {
  console.log("数据库关闭成功");
});

var TestModel = MongoApp.model("users", {
  name: {
    //用户昵称可以修改
    type: String
  },
  username: String, //账户 不可以修改
  password: String,
  roles: [String],
  avatar: String,
  introduction: String
});
// token 生成器
var jwt = require("jsonwebtoken");
// 服务端秘钥
var ssh = "wdsafghjksfdfwefwefdsghwwwpppdhdfafdregergdfgdfgdfgad";
var createToken = (
  data = {
    username: "admin"
  }
) => {
  // sign 第一参：加密的数据，第二个私钥，四三个过期时间和一些配置
  return jwt.sign(data, ssh, {
    expiresIn: "1h"
  });
};
var verifyToken = token => {
  // 如果校验不成功，终止程序
  try {
    var result = jwt.verify(token, ssh);
    return result;
  } catch (err) {
    return false;
  }
};
// 登录接口，做一个token
exApp.post("/login", (req, res) => {
  // 做基础校验
  const { username, password } = req.body;
  if (!username || !password) {
    return res.json({
      code: 0,
      msg: "非法校验"
    });
  }
  // 在数据库尽心校验
  TestModel.findOne({
    username,
    password
  }).then(result => {
    // 查询完毕响应接口
    if (!result) {
      // 操作数据库出错
      return res.json({
        code: 0,
        msg: "数据库查询出错"
      });
    } else {
      res.json({
        code: 1,
        msg: "登录成功6666",
        data: {
          token: createToken({
            username
          })
        }
      });
    }
  });
});
// 获取用户信息接口
exApp.post("/getInfo", async (req, res) => {
  var { token } = req.body;
  if (!token) {
    return res.json({
      code: 0,
      msg: "令牌错误"
    });
  }
  // 校验token
  const tokenData = verifyToken(token);
  //    如果解析后的token值合法 去数据库找用户 把信息拿出来
  if (tokenData && tokenData.username) {
    // 查询数据库里的用户信息
    let result = await TestModel.findOne(
      {
        username: tokenData.username
      },
      null,
      {
        lean: true
      }
    );
    //   result 不是单纯的js对象，而是一个文档，数据结构不一样
    if (result) {
      const { password, ...data } = result;
      res.json({
        code: 1,
        msg: "登录成功777",
        // token:createToken(tokenData)
        data: { ...data }
      });
    } else {
      res.json({
        code: 0,
        msg: "获取失败"
      });
    }
  }
});

exApp.post("/logout", (req, res) => {
  // 如何获取请求头的信息
  const token = req.get("X-Token");
  // 校验token
  if (!token)
    return res.json({
      code: 0,
      msg: "令牌丢失"
    });
  if (verifyToken(token)) {
    res.json({
      code: 1,
      msg: "退出成功"
    });
  }
});
// 开启静态资源目录
var path = require("path");
var multiparty = require("multiparty");
var images = require("images");
var fs = require('fs')
exApp.use("/zy", express.static(path.join(__dirname, "imgs")));
exApp.post("/upLoad", (req, res) => {
  //0. 先设置好图片要存入的文件夹
  var pathName = path.join(__dirname, "imgs");
  //1. 获取图片数据  multiparty  images  初始化保存图片的插件
  var form = new multiparty.Form({ uploadDir: pathName });
  //2. 插件先把图片存到bending的磁盘指定地方
  form.parse(req, async (err, fil, file) => {
    // 如果保存失败
    if (err) {
      return res.json({ code: 0, msg: "保存出错" });
    }
    //3.另一插件 压缩图片 并替换之前的图片
    const fileName = path.basename(file.img[0].path)
    const url = "http://127.0.0.1:3000/" + fileName
    images(file.img[0].path).size(50).save(pathName + '/' + fileName, { quality: 50 })
    //4.把用户数据库里的头像地址 改成现在最新的
    const { username } = verifyToken(req.get("X-Token"))

    //5.最后接口返回最新的用户信息
    const doc = await TestModel.findOne({ username })
    if (!doc.avatar.includes('base64')) {
      //   如果头像不是base64就删掉
      var oldImg = path.basename(doc.avatar)
      try {
        status = fs.unlinkSync(pathName + '/' + oldImg)//删除文件
      } catch (err) {
        console.log("删除文件失败", err);
      }
    }
    await TestModel.findByIdAndUpdate(
      { username },
      { avatar: url },
      { new: true }
    ).then(res => {
      res.json({ code: 0, msg: "成功" });
    });
  });
});
